﻿/*!
 * $ProjectName: $
 * $ProjectRevision: Last Checkpoint: $
 * $Last Checkpoint: $
 * $Source: $
 * $Revision:  $
 * $Author: $
 * $Date:  $
 *
 * Copyright © 2011
 * BEB Industrie-Elektronik AG
 * All rights reserved
 * The code is provided "as is" with no expressed or implied warranty.
 */

namespace LoadSpiellisten
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    public class Spieler : IComparable
    {
        private int _lic;
        private Dictionary<int, int> _streiche;
        private int _maxStreich;

        private int _position;
        private static double _maxStreiche = int.MinValue;
        private static double _grenze;

        public static double MaxStreiche
        {
            get
            {
                return _maxStreiche;
            }
            set
            {
                _maxStreiche = value;
            }
        }

        public static double Streichgrenze
        {
            get
            {
                return _grenze;
            }
            set
            {
                _grenze = value;
            }
        }

        public int Position
        {
            get { return _position; }
            set { _position = value; }
        }

        public int Lic
        {
            get { return _lic; }
            set { _lic = value; }
        }

        public string NameLang
        {
            get
            {
                return string.Format("{0} {1} '{2}", Name, Vorname, GeburtsDatum.ToString("yy"));
            }
        }

        public string NameLangResultateSchnitt
        {
            get
            {
                double schnitt = Durchschnitt;
                double schnittresultat = schnitt * 4;

                return string.Format("{0} {1} '{2}  - Ø {3:0.00}({4:0.00})", Name, 
                                                                        Vorname, 
                                                                        GeburtsDatum.ToString("yy"),
                                                                        schnittresultat,
                                                                        schnitt);
            }
        }

        public Spieler(int lizenznummer, int maxStreich)
        {
            _lic = lizenznummer;
            _streiche = new Dictionary<int, int>();
            for (int i = 0; i <= maxStreich; i++)
            {
                _streiche.Add(i, 0);
            }
            _maxStreich = maxStreich;
        }

        public IDictionary<int, int> Streiche
        {
            get
            {
                return _streiche;
            }
        }

        public double Durchschnitt
        {
            get
            {
                return TotalPunkte / AnzahlStreiche;
            }
        }

        public double Standartabweichung
        {
            get
            {
                double durchschnitt = Durchschnitt;
                double varianz = 0.0;
                int numStreiche = 0;
                foreach (KeyValuePair<int, int> streich in Streiche)
                {
                    varianz += Math.Pow(streich.Key - durchschnitt, 2) * streich.Value;
                    numStreiche += streich.Value;
                }
                varianz = varianz / numStreiche;
                return Math.Sqrt(varianz);
            }
        }

        internal void ResetStreiche()
        {
            for (int i = 0; i <= _maxStreich; i++ )
            {
                _streiche[i] = 0;
            }
        }

        public double TotalPunkte 
        {
            get
            { 
                double total = 0.0;
                foreach (KeyValuePair<int, int> pair in _streiche)
                {
                    total += pair.Key * pair.Value;
                }
                return total;
            }

        }

        public double AnzahlStreiche
        {
            get
            {
                double numStreich = 0.0;
                foreach (KeyValuePair<int, int> pair in _streiche)
                {
                    numStreich += pair.Value;
                }
                return numStreich;
            }

        }

        public int CompareTo(object obj)
        {
            Spieler spieler2 = obj as Spieler;

            double streicheProzent = this.AnzahlStreiche / Spieler.MaxStreiche * 100;
            double streicheProzent2 = spieler2.AnzahlStreiche / Spieler.MaxStreiche * 100;

            if ((streicheProzent > Spieler.Streichgrenze && streicheProzent2 > Spieler.Streichgrenze) ||
                (streicheProzent < Spieler.Streichgrenze && streicheProzent2 < Spieler.Streichgrenze))
            {
                return Durchschnitt.CompareTo(spieler2.Durchschnitt);
            }
            else if (streicheProzent > Spieler.Streichgrenze)
            {
                // Der aktuelle Spieler ist in gruppe mit Streichen über der grenze 
                // und der spieler 2 in gruppe unter der grenze
                return 1;
            }
            else
            {
                // Der aktuelle Spieler ist in gruppe mit Streichen unter der grenze 
                // und der spieler 2 in gruppe über der grenze
                return -1;
            }
        }

        public string Name { get; set; }

        public string Vorname { get; set; }

        public DateTime GeburtsDatum { get; set; }

        public Dictionary<string, int?> DurchschnittsResultate { get; set; }
        public Dictionary<string, int?> Resultate { get; set; }
    }
}

/*
 * History of MKS Source Code Control System
 *
 * $Log: $
 * 
 */